Como os dados estão estruturados e como podem ser combinados com outros afim de que algumas hipóteses sejam testadas e observadas?
# Import libraries and modules
import pandas as pd
import numpy as np
import requests
import openai
#https://stackoverflow.com/questions/20625582/how-to-deal-with-settingwithcopywarning-in-pandas
pd.options.mode.chained_assignment = None # default='warn'
from bs4 import BeautifulSoup as bs
from pandas import Series, DataFrame
from datetime import datetime, timedelta
import matplotlib.pylab as plt
import seaborn as sns
import decimal
from decimal import Decimal
import re
plt.style.use('ggplot')
sales_data = pd.read_csv('./data/csv_files/sales_data.csv')
Um olhar sobre as primeiras linhas:
sales_data.head()
| Data | NF | Est | Pedido | Cliente | Descrição | Esp | Larg | Comp | Preço_pç | Preço_kg | Quantidade | Total | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 01-06-2007 | 0319203 | 11 | 1223-30 | JRIND. | CHAPA GR LTQ DEC 6,30 NBR8300 OL | 6,3000 | 1.200,0000 | 3.000,0000 | 0,00 | 2,53 | 1.456,00 | 3.867,86 |
| 1 | 01-06-2007 | 0319202 | 11 | 3350-20 | JRIND. | CHAPA FQ DEC 4,25 NBR6658 OL | 4,2500 | 1.200,0000 | 3.000,0000 | 0,00 | 2,35 | 3.081,00 | 7.602,37 |
| 2 | 01-06-2007 | 0319187 | 11 | 4737-10 | FORMA | CHAPA FF 0,60 NBR6658 OL | 0,6000 | 1.200,0000 | 1.850,0000 | 0,00 | 2,85 | 2.129,00 | 6.371,03 |
| 3 | 01-08-2007 | 0323897 | 11 | 9477-10 | ENIOSCARIOT | CHAPA FQ 2,00 SEGUNDA QUALIDADE | 2,0000 | 1.000,0000 | 3.000,0000 | 0,00 | 2,20 | 1.281,00 | 2.959,11 |
| 4 | 01-08-2007 | 0323897 | 11 | 9477-20 | ENIOSCARIOT | CHAPA FQ 2,65 SEGUNDA QUALIDADE | 2,6500 | 1.000,0000 | 3.000,0000 | 0,00 | 2,15 | 664,00 | 1.498,98 |
Um olhar sobre as ultimas linhas:
sales_data.tail()
| Data | NF | Est | Pedido | Cliente | Descrição | Esp | Larg | Comp | Preço_pç | Preço_kg | Quantidade | Total | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 19134 | 31-08-2023 | 331524 | 11 | 357068-10 | SASPLASTI | TIRA ZC BOB 0,50 NBR7008 ZC CR NO REV | 0,5000 | 78,0000 | 0,0000 | 0,00 | 8,92 | 2.876,00 | 26.487,67 |
| 19135 | 31-08-2023 | 331525 | 11 | 357491-10 | FLANTECH | TIRA ZC BOB 1,25 NBR7008 ZC CR MI REV | 1,2500 | 23,5000 | 0,0000 | 0,00 | 9,95 | 3.217,00 | 33.049,45 |
| 19136 | 31-08-2023 | 331525 | 11 | 357101-20 | FLANTECH | TIRA ZC BOB 1,25 NBR7008 ZC CR MI REV | 1,2500 | 32,0000 | 0,0000 | 0,00 | 9,95 | 569,00 | 5.845,55 |
| 19137 | 31-08-2023 | 84291 | 14 | 359882-10 | ACOPLANO | BOB AL/ZN 0,50 ASTM A792 CN C/TQ ACA | 0,5000 | 1.200,0000 | 0,0000 | 0,00 | 7,50 | 16.140,00 | 124.984,13 |
| 19138 | 31-10-2023 | 334868 | 11 | 363346-10 | METMETALCIN | TIRA FF BOB 0,25 G2L290 BbOL SMODI | 0,2500 | 47,0000 | 0,0000 | 0,00 | 9,95 | 2.250,00 | 23.115,09 |
Os dados importados abrangem os anos de 2007 a 2023
products = pd.read_csv('./data/csv_files/products.csv')
products.head()
| Descrição | Tipo de Produto | Comissão | Família Produto | |
|---|---|---|---|---|
| 0 | BLANK CL FF OL 0,75 NBR 6658 | BKFF | 2% | BLANK |
| 1 | BLANK CL FF OL 0,90 NBR 6658 | BKFF | 2% | BLANK |
| 2 | BLANK CL FF OL 1,20 NBR 6658 | BKFF | 2% | BLANK |
| 3 | BLANK CL FF OL 1,50 NBR 6658 | BKFF | 2% | BLANK |
| 4 | BLANK CL FF OL 1,90 NBR 6658 | BKFF | 2% | BLANK |
Como as colunas "Descrição" nos conjuntos de dados sales_data e products contém o mesmo tipo de informação, serão usadas para mesclar os dois conjuntos de dados a fim de obter informações mais categorizadas sobre os produtos. As colunas "Cod" e "Unnamed" não fazem sentido manter, então as eliminaremos posteriormente.
Inspecionando os tipos de dados em sales_data:
sales_data.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 19139 entries, 0 to 19138 Data columns (total 13 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Data 19139 non-null object 1 NF 19139 non-null object 2 Est 19139 non-null object 3 Pedido 19139 non-null object 4 Cliente 19139 non-null object 5 Descrição 19139 non-null object 6 Esp 19139 non-null object 7 Larg 19139 non-null object 8 Comp 19139 non-null object 9 Preço_pç 19139 non-null object 10 Preço_kg 19139 non-null object 11 Quantidade 19139 non-null object 12 Total 19139 non-null object dtypes: object(13) memory usage: 1.9+ MB
Serão necessárias algumas alterações nos tipos de dados para realizar uma manipulação adequada dos dados. Por exemplo, o campo "Data", precisa ser convertido para o formato de data e hora (Datetime). À primeira vista, também observamos que a quantidade de valores não nulos é praticamente inexistente em todos os campos do conjunto de dados.
Inspecionando os tipos de dados em products:
products.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 2790 entries, 0 to 2789 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Descrição 2790 non-null object 1 Tipo de Produto 2790 non-null object 2 Comissão 2790 non-null object 3 Família Produto 2790 non-null object dtypes: object(4) memory usage: 87.3+ KB
O campo "Comissão" precisa ser convertido para o formato numérico. Os campos Unnamed devem ser eliminados.
Eliminar colunas desnecessárias e atribuir tipos de dados apropriados para garantir cálculos precisos. Isso inclui remover quaisquer valores NaN (ausentes) e verificar duplicatas nos dados.
Ao remover colunas desnecessárias, podemos simplificar o DataFrame e focar apenas nas informações relevantes. Isso ajuda a reduzir a confusão e a melhorar a eficiência das análises subsequentes.
Atribuir tipos de dados apropriados às colunas é importante para garantir cálculos precisos e interpretações significativas. Por exemplo, colunas numéricas devem ser atribuídas aos tipos de dados numéricos corretos (por exemplo, int ou float), colunas de data devem ser atribuídas ao tipo de dados datetime, e colunas categóricas devem ser atribuídas ao tipo de dados categoria.
Remover valores NaN é crucial para garantir que os dados estejam limpos e completos. Valores NaN podem prejudicar cálculos e análises, portanto, é importante lidar com eles adequadamente, seja imputando valores ausentes ou excluindo linhas com dados faltantes, dependendo do contexto específico e dos requisitos.
Verificar duplicatas ajuda a identificar entradas redundantes ou repetidas nos dados. Ao identificar e remover duplicatas, você pode garantir que cada ponto de dados seja único e evitar distorcer os resultados de suas análises.
Ao executar essas etapas nesta fase, termos um DataFrame refinado otimizado para cálculos precisos, análises significativas e insights confiáveis.
#sales_data ['Data'] = pd.to_datetime(sales_data['Data'])
sales_data['Data'] = pd.to_datetime(sales_data['Data'], format='%d-%m-%Y')
print(sales_data['Data'].isnull().sum())
0
sales_data['Preço_kg'] = sales_data['Preço_kg'].apply(lambda x: str(x.split()[0].replace(',', '.')))
sales_data['Preço_kg'] = sales_data['Preço_kg'].apply(lambda x: float(x.strip().replace('None', '0.00')))
#pd.set_option('display.max_rows', None) # Set the maximum number of rows to display
print(sales_data['Preço_kg'])
0 2.53
1 2.35
2 2.85
3 2.20
4 2.15
...
19134 8.92
19135 9.95
19136 9.95
19137 7.50
19138 9.95
Name: Preço_kg, Length: 19139, dtype: float64
sales_data['Preço_pç'] = sales_data['Preço_pç'].apply(lambda x: str(x.split()[0].replace(',', '.')))
sales_data['Preço_pç'] = sales_data['Preço_pç'].apply(lambda x: float(x.strip().replace('None', '0.00')))
#pd.set_option('display.max_rows', None) # Set the maximum number of rows to display
print(sales_data['Preço_pç'])
0 0.0
1 0.0
2 0.0
3 0.0
4 0.0
...
19134 0.0
19135 0.0
19136 0.0
19137 0.0
19138 0.0
Name: Preço_pç, Length: 19139, dtype: float64
sales_data['Quantidade'] = sales_data['Quantidade'].apply(lambda x: str(x.split()[0].replace('.', '')))
sales_data['Quantidade'] = sales_data['Quantidade'].apply(lambda x: re.sub(r'(\,\d\d)', '', x))
sales_data['Quantidade'] = sales_data['Quantidade'].apply(lambda x: int(x.strip().replace('None', '0')))
sales_data['Quantidade'] = sales_data['Quantidade'].astype(int)
print(sales_data['Quantidade'])
0 1456
1 3081
2 2129
3 1281
4 664
...
19134 2876
19135 3217
19136 569
19137 16140
19138 2250
Name: Quantidade, Length: 19139, dtype: int64
Removendo a coluna Total e criando novamento por ser mais simples e direto do que fazer tratamento.
sales_data.drop(['Total'], axis=1, inplace=True)
sales_data['Total'] = sales_data['Preço_kg'] * sales_data['Quantidade']
Descrição tem um espaço em branco na frente, que pode causar problemas quando juntar sales_data e products.
sales_data['Descrição'][0]
' CHAPA GR LTQ DEC 6,30 NBR8300 OL'
Removendo o esaço em branco na frente da Descrição.
sales_data['Descrição'] = sales_data['Descrição'].str.lstrip()
sales_data.head()
| Data | NF | Est | Pedido | Cliente | Descrição | Esp | Larg | Comp | Preço_pç | Preço_kg | Quantidade | Total | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2007-06-01 | 0319203 | 11 | 1223-30 | JRIND. | CHAPA GR LTQ DEC 6,30 NBR8300 OL | 6,3000 | 1.200,0000 | 3.000,0000 | 0.0 | 2.53 | 1456 | 3683.68 |
| 1 | 2007-06-01 | 0319202 | 11 | 3350-20 | JRIND. | CHAPA FQ DEC 4,25 NBR6658 OL | 4,2500 | 1.200,0000 | 3.000,0000 | 0.0 | 2.35 | 3081 | 7240.35 |
| 2 | 2007-06-01 | 0319187 | 11 | 4737-10 | FORMA | CHAPA FF 0,60 NBR6658 OL | 0,6000 | 1.200,0000 | 1.850,0000 | 0.0 | 2.85 | 2129 | 6067.65 |
| 3 | 2007-08-01 | 0323897 | 11 | 9477-10 | ENIOSCARIOT | CHAPA FQ 2,00 SEGUNDA QUALIDADE | 2,0000 | 1.000,0000 | 3.000,0000 | 0.0 | 2.20 | 1281 | 2818.20 |
| 4 | 2007-08-01 | 0323897 | 11 | 9477-20 | ENIOSCARIOT | CHAPA FQ 2,65 SEGUNDA QUALIDADE | 2,6500 | 1.000,0000 | 3.000,0000 | 0.0 | 2.15 | 664 | 1427.60 |
products.head()
| Descrição | Tipo de Produto | Comissão | Família Produto | |
|---|---|---|---|---|
| 0 | BLANK CL FF OL 0,75 NBR 6658 | BKFF | 2% | BLANK |
| 1 | BLANK CL FF OL 0,90 NBR 6658 | BKFF | 2% | BLANK |
| 2 | BLANK CL FF OL 1,20 NBR 6658 | BKFF | 2% | BLANK |
| 3 | BLANK CL FF OL 1,50 NBR 6658 | BKFF | 2% | BLANK |
| 4 | BLANK CL FF OL 1,90 NBR 6658 | BKFF | 2% | BLANK |
Mesclando sales_data e products em um único DataFrame.
sales_data = pd.merge(sales_data, products)
Vamos analisar a possível correlação entre o preço do Dólar e a variação nos preços dos materiais, para isso é necessário importar a série histórica das flutuações da taxa de câmbio do Dólar em Reais.
Start Web Scraping:
r = requests.get("http://www.ipeadata.gov.br/ExibeSerie.aspx?serid=38590&module=M")
Usar dados salvos em caso de economizar processamento:
dollar_df = pd.read_csv('./data/csv_files/dollar.csv')
Convert to a beautiful soup object:
# soup = bs(r.content)
# soup.prettify()
Mesmo ao usar 'soup.prettify()', que adiciona indentação e quebras de linha, ainda é difícil visualizar a estrutura da página. No entanto, os dados que estamos buscando estão estruturados na forma de uma tabela, como mostrado abaixo.
Ao inspecionar a tabela, é evidente que os dados que estamos buscando, data e valor, são inseridos dentro das tags com um ID que segue o padrão id="grd_DXDataRow0", onde "Rows0" no final indica os dados mais recentes.
Portanto, podemos criar uma função que busca por esse padrão de ID dentro das tags dentro do objeto soup e, em seguida, coleta os dados dentro de cada tag .
Para definir o intervalo de dados a ser extraído da web, podemos assumir que o campo "Data" de sales_data está em ordem cronológica.
Podemos começar identificando a data da primeira ocorrência. Em seguida, calculamos a diferença no número de dias entre a última ocorrência e a data de hoje. Essa diferença calculada servirá como o intervalo para a extração de dados na web, garantindo que apenas os dados dentro desse período específico sejam coletados.
first_date = pd.to_datetime(sales_data ['Data'].iloc[0]).date()
today = datetime.today().date()
range_date = (today - first_date).days
print(f' Today is: {today}')
print(f' The first date in the dataset is: {first_date}')
print(f' The range_date is: {range_date}')
Today is: 2023-12-07 The first date in the dataset is: 2007-06-01 The range_date is: 6033
Agora podemos definir uma função que recupera os valores do dólar dentro do período de tempo especificado e retorna um DataFrame com os valores do dólar e as datas em formato datetime.
Para realizar essa pesquisa, a função assume um padrão de ID fixo no HTML e incrementa a parte final do ID, que representa cada linha da tabela, em cada iteração do loop.
# def get_dollar_value():
# date = []
# value = []
# for id in range((range_date)):
# id = str(id)
# pattern = 'grd_DXDataRow' + id
# id = int(id)
# # It searches for the first <tr> element that has an id attribute matching the pattern
# tr = soup.find('tr', {'id' : pattern})
# # retrieves all the <td> (table cell) elements within a specific <tr> (table row) element.
# t_data_tags = tr.find_all("td")
# date.append(t_data_tags[0].text)
# value.append(t_data_tags[1].text)
# date[id] = datetime.strptime(date[id], '%d/%m/%Y')
# if (date[id]) == first_date:
# break
# data = {'Data': date, 'US_Dollar_in_R$': value}
# dollar_df = pd.DataFrame(data)
# return dollar_df
Obtendo valores do dólar:
# dollar_df = get_dollar_value()
dollar_df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 6031 entries, 0 to 6030 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Data 6031 non-null object 1 US_Dollar_in_R$ 6031 non-null object dtypes: object(2) memory usage: 94.4+ KB
Converter Data para o formato datetime e verificar valores nulos:
dollar_df['Data'] = pd.to_datetime(dollar_df['Data'])
print(sales_data['Data'].isnull().sum())
0
Converter US_Dollar_in_R$ para o formato float e verificar valores nulos:
dollar_df['US_Dollar_in_R$'] = dollar_df['US_Dollar_in_R$'].apply(lambda x: str(x.split()[0].replace(',', '.')))
dollar_df['US_Dollar_in_R$'] = dollar_df['US_Dollar_in_R$'].astype(float)
print(dollar_df['US_Dollar_in_R$'].isnull().sum())
0
Salvando valores do como csv:
#dollar_df.to_csv('./data/csv_files/dollar.csv', index =False)
dollar_df.head()
| Data | US_Dollar_in_R$ | |
|---|---|---|
| 0 | 2023-12-05 | 4.9516 |
| 1 | 2023-12-04 | 4.9085 |
| 2 | 2023-12-01 | 4.9185 |
| 3 | 2023-11-30 | 4.9349 |
| 4 | 2023-11-29 | 4.8927 |
dollar_df.tail()
| Data | US_Dollar_in_R$ | |
|---|---|---|
| 6026 | 1999-11-12 | 1.9323 |
| 6027 | 1999-11-11 | 1.9280 |
| 6028 | 1999-11-10 | 1.9340 |
| 6029 | 1999-11-09 | 1.9233 |
| 6030 | 1999-11-08 | 1.9258 |
dollar_df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 6031 entries, 0 to 6030 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Data 6031 non-null datetime64[ns] 1 US_Dollar_in_R$ 6031 non-null float64 dtypes: datetime64[ns](1), float64(1) memory usage: 94.4 KB
Mesclando sales_data e dollar_df em um único DataFrame.
sales_data = pd.merge(sales_data, dollar_df)
Checando valores NaN:
sales_data.isna().sum()
Data 0 NF 0 Est 0 Pedido 0 Cliente 0 Descrição 0 Esp 0 Larg 0 Comp 0 Preço_pç 0 Preço_kg 0 Quantidade 0 Total 0 Tipo de Produto 0 Comissão 0 Família Produto 0 US_Dollar_in_R$ 0 dtype: int64
sales_data.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 19197 entries, 0 to 19196 Data columns (total 17 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Data 19197 non-null datetime64[ns] 1 NF 19197 non-null object 2 Est 19197 non-null object 3 Pedido 19197 non-null object 4 Cliente 19197 non-null object 5 Descrição 19197 non-null object 6 Esp 19197 non-null object 7 Larg 19197 non-null object 8 Comp 19197 non-null object 9 Preço_pç 19197 non-null float64 10 Preço_kg 19197 non-null float64 11 Quantidade 19197 non-null int64 12 Total 19197 non-null float64 13 Tipo de Produto 19197 non-null object 14 Comissão 19197 non-null object 15 Família Produto 19197 non-null object 16 US_Dollar_in_R$ 19197 non-null float64 dtypes: datetime64[ns](1), float64(4), int64(1), object(11) memory usage: 2.6+ MB
Houve uma variação no volume de dados em sales_data . Primeiramente, tínhamos 19139 linhas, após mesclar com products ficamos com 19840 linhas em todos os campos, e finalmente após mesclar com dollar_df obtivemos 19197.
Essa variação no número de linhas pode ser atribuída à duplicação de valores após a mesclagem com a tabela de produtos. É essencial abordar esse problema no futuro para garantir a integridade dos dados no banco de dados do nosso sistema.
Podemos usar as colunas Pedido e Quantidade como identificadores de valores duplicados já que mais de uma ocorrência repetida destes dois valores pode representar a presença de entradas duplicadas no conjunto de dados.
duplicates = sales_data.duplicated(subset=['NF','Pedido','Cliente','Quantidade'], keep = False)
# Filter the original DataFrame to show only the duplicate rows
duplicate_rows = sales_data[duplicates]
for index, row in duplicate_rows.iterrows():
print(f'Original:{row["NF"]} - {row["Cliente"]} - {row["Pedido"]} - {row["Quantidade"]}, Duplicated:{row["NF"]} - {row["Cliente"]} {row["Pedido"]} - {row["Quantidade"]}')
print(f'The number of duplicates is: {duplicates.sum()}')
#duplicates.head()
The number of duplicates is: 0
duplicate_rows.head()
| Data | NF | Est | Pedido | Cliente | Descrição | Esp | Larg | Comp | Preço_pç | Preço_kg | Quantidade | Total | Tipo de Produto | Comissão | Família Produto | US_Dollar_in_R$ | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 129 | 2007-06-19 | 0320336 | 11 | 4653-10 | REVALIND | TR REL 1,20 BOB NBR5007 G4RL BbOL | 1,2000 | 59,0000 | 0,0000 | 0.0 | 3.55 | 2353 | 8353.15 | TIRA REL | 2% | RELAMINADO | 1.9100 |
| 130 | 2007-06-19 | 0320336 | 11 | 4653-10 | REVALIND | TR REL 1,20 BOB NBR5007 G4RL BbOL | 1,2000 | 59,0000 | 0,0000 | 0.0 | 3.55 | 2353 | 8353.15 | TIRA REL | 2% | RELAMINADO | 1.9100 |
| 265 | 2008-03-12 | 0000072 | 14 | 22958-10 | COPRIMA | TIRA FQ 3,00 NBR6658 | 3,0000 | 100,0000 | 1.200,0000 | 0.0 | 2.57 | 548 | 1408.36 | TFQ | 2% | TIRA CORTADA | 1.6788 |
| 266 | 2008-03-12 | 0000072 | 14 | 22958-10 | COPRIMA | TIRA FQ 3,00 NBR6658 | 3,0000 | 100,0000 | 1.200,0000 | 0.0 | 2.57 | 548 | 1408.36 | TFQ | 2% | TIRA CORTADA | 1.6788 |
| 313 | 2008-01-29 | 0336385 | 11 | 18788-20 | REVALIND | TR REL 1,20 BOB NBR5007 G4RL BbOL | 1,2000 | 59,0000 | 0,0000 | 0.0 | 3.55 | 2299 | 8161.45 | TIRA REL | 2% | RELAMINADO | 1.7754 |
# Drop the duplicates and assign the result back to final_df
sales_data = sales_data.drop_duplicates(subset=['NF','Pedido','Cliente','Quantidade']).reset_index(drop = True)
# Check for duplicates and print the number of duplicates
duplicates = sales_data.loc[sales_data.duplicated(subset=['NF','Pedido','Cliente','Quantidade'])]
print(f'The number of duplicates is: {sales_data.duplicated(subset=["NF","Pedido","Cliente","Quantidade"]).sum()}')
# Display the duplicates (if any)
print(duplicates)
The number of duplicates is: 0 Empty DataFrame Columns: [Data, NF, Est, Pedido, Cliente, Descrição, Esp, Larg, Comp, Preço_pç, Preço_kg, Quantidade, Total, Tipo de Produto, Comissão, Família Produto, US_Dollar_in_R$] Index: []
Duplicadas removidas!
Agora, criaremos colunas separadas para dia, mês e ano a partir da coluna 'Data' que serão usadas para agrupar dados.
Será criada a coluna 'Preço_KG_USD' que indicará o preço por quilo em Dólares.
Essas operações realizadas no DataFrame terão as seguintes implicações:
A criação das colunas 'Dia', 'Mês' e 'Ano' permite uma melhor organização e análise dos dados com base nesses componentes temporais. Isso possibilita agrupar e extrair insights em um nível granular, como tendências de vendas por dia, mês ou ano.
A criação da coluna 'Price_KG_USD' oferece uma perspectiva adicional sobre preços, convertendo o preço por quilo de Real Brasileiro para Dólares Americanos (USD/Kg). Essa conversão facilita comparações com mercados internacionais e permite a análise de diferenciais de preço e competitividade.
Finalmente, a reorganização das colunas no DataFrame ajuda a melhorar a legibilidade e garante que as colunas estejam organizadas de acordo com a ordem desejada especificada no código. Isso pode ser útil para uma interpretação mais fácil dos dados e análises subsequentes.
# Create a day column and Get the day from Date
sales_data['Dia'] = sales_data['Data'].dt.day.astype(int)
# Create a Month column and Get the month from Date
sales_data['Mês'] = (sales_data['Data'].dt.month).astype(int)
# Create a Year column and get the year from Date
sales_data['Ano'] = sales_data['Data'].dt.year.astype(int)
# Create a Column for USD/kg price by converting the R$/Kg Price as USD/Kg Price
sales_data['Preço_KG_USD'] = sales_data['Preço_kg'] / sales_data['US_Dollar_in_R$']
# Reorder the columns
sales_data= pd.DataFrame(sales_data, columns=["Data",'Dia','Mês','Ano','NF','Cliente','Pedido',"Descrição",
'Esp','Larg','Comp','Tipo de Produto','Família Produto',
'Quantidade','Preço_pç','Preço_kg','US_Dollar_in_R$','Preço_KG_USD','Total','Comissão'
])
sales_data.loc[0:1]
| Data | Dia | Mês | Ano | NF | Cliente | Pedido | Descrição | Esp | Larg | Comp | Tipo de Produto | Família Produto | Quantidade | Preço_pç | Preço_kg | US_Dollar_in_R$ | Preço_KG_USD | Total | Comissão | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2007-06-01 | 1 | 6 | 2007 | 0319203 | JRIND. | 1223-30 | CHAPA GR LTQ DEC 6,30 NBR8300 OL | 6,3000 | 1.200,0000 | 3.000,0000 | CHAPA GR LTQ DECOL | CHAPA | 1456 | 0.0 | 2.53 | 1.9048 | 1.328223 | 3683.68 | 1% |
| 1 | 2007-06-01 | 1 | 6 | 2007 | 0319202 | JRIND. | 3350-20 | CHAPA FQ DEC 4,25 NBR6658 OL | 4,2500 | 1.200,0000 | 3.000,0000 | CFQ DEC OL | CHAPA | 3081 | 0.0 | 2.35 | 1.9048 | 1.233725 | 7240.35 | 1% |
A ideia agora é extrair determinados valores em variáveis para que possam ser usados para calcular métricas e visualizar a distribuição dos valores posteriormente.
Em resumo, pretendemos fazer o seguinte:
Extrair os valores únicos da coluna 'Dia' e armazená-los na variável 'dias'. Esta lista representará a ordem cronológica dos dias e pode ser usada para analisar o montante de vendas em cada dia.
Extrair os valores únicos da coluna 'Mês' e armazená-los na variável 'meses'. Esta lista representará a ordem cronológica dos meses e pode ser usada para analisar o montante de vendas mensalmente.
Extrair os valores únicos da coluna 'Ano' e armazená-los na variável 'anos'. Esta lista representará a ordem cronológica dos anos e pode ser usada para analisar o montante de vendas anualmente.
Recuperar os valores das colunas 'Quantidade', 'Esp', 'Larg' e 'Preços'. Essas listas de quantidades, espessuras, larguras e preços podem ser usadas para análises ou cálculos adicionais.
Essas operações permitem a extração de valores únicos de colunas específicas, possibilitando análises com base em dias, meses e anos. Além disso, os valores de outras colunas podem ser usados para diversos fins, como calcular estatísticas ou realizar análises adicionais no conjunto de dados.
# To obtain a list of days in chronological order, we can extract the unique values from the 'Day' column.
dias = (sales_data['Dia'].unique()).astype(int)
dias.sort()
dias
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31])
# To obtain a list of months in chronological order, we can extract the unique values from the 'Month' column.
meses = (sales_data['Mês'].unique()).astype(int)
meses.sort()
meses
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
# To obtain a list of years in chronological order, we can extract the unique values from the 'Year' column.
anos = (sales_data['Ano'].unique()).astype(int)
anos.sort()
anos
array([2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017,
2018, 2019, 2020, 2021, 2022, 2023])
quantidades = (sales_data['Quantidade'])
espessuras = (sales_data['Esp'].unique())
espessuras.sort()
espessuras
array(['0,2500', '0,2700', '0,3000', '0,3300', '0,3500', '0,4000',
'0,4300', '0,4500', '0,4700', '0,4900', '0,5000', '0,5500',
'0,6000', '0,6500', '0,7000', '0,7500', '0,8000', '0,8100',
'0,9000', '0,9500', '1,0000', '1,0600', '1,1100', '1,2000',
'1,2100', '1,2400', '1,2500', '1,5000', '1,5500', '1,6000',
'1,8000', '1,9000', '1,9500', '10,0000', '11,2000', '12,5000',
'14,0000', '150,0000', '16,0000', '19,0000', '2,0000', '2,2500',
'2,3000', '2,5000', '2,6500', '2,7000', '2,9900', '22,4000',
'25,0000', '3,0000', '3,3500', '3,5000', '3,7500', '31,5000',
'37,5000', '4,0000', '4,2500', '4,7400', '4,7500', '44,5000',
'50,0000', '6,3000', '6,3500', '63,0000', '75,0000', '8,0000',
'89,0000', '9,0000', '9,5000'], dtype=object)
larguras = (sales_data['Larg'].unique())
larguras.sort()
larguras
array(['0,0000', '1.000,0000', '1.045,0000', '1.060,0000', '1.080,0000',
'1.100,0000', '1.120,0000', '1.132,0000', '1.140,0000',
'1.150,0000', '1.200,0000', '1.220,0000', '1.245,0000',
'1.250,0000', '1.300,0000', '1.400,0000', '1.500,0000',
'1.800,0000', '100,0000', '101,0000', '101,5000', '102,0000',
'103,0000', '104,0000', '105,0000', '106,0000', '107,0000',
'11,0000', '110,0000', '111,0000', '111,5000', '112,0000',
'113,0000', '115,0000', '116,0000', '118,0000', '119,0000',
'12,0000', '12,5000', '120,0000', '121,0000', '122,0000',
'122,8000', '124,0000', '125,0000', '127,0000', '128,0000',
'130,0000', '132,0000', '138,0000', '139,0000', '14,0000',
'140,0000', '140,5000', '142,0000', '145,0000', '145,8000',
'147,0000', '148,0000', '149,5000', '15,0000', '150,0000',
'155,0000', '157,0000', '16,0000', '160,0000', '161,0000',
'162,0000', '165,0000', '166,0000', '17,0000', '170,0000',
'175,0000', '18,0000', '182,0000', '184,0000', '185,0000',
'19,0000', '19,2000', '19,8000', '190,0000', '191,0000',
'192,0000', '194,0000', '195,5000', '198,0000', '2.000,0000',
'2.440,0000', '20,0000', '20,8000', '200,0000', '202,0000',
'203,0000', '204,0000', '207,0000', '21,0000', '21,7000',
'210,0000', '213,0000', '217,0000', '219,0000', '22,0000',
'222,0000', '223,0000', '224,0000', '225,0000', '228,0000',
'23,0000', '23,2000', '23,5000', '238,0000', '239,0000', '24,0000',
'24,2000', '24,5000', '24,7000', '240,0000', '243,0000',
'248,0000', '25,0000', '25,4000', '25,8000', '250,0000',
'252,0000', '26,0000', '26,5000', '260,0000', '265,0000',
'268,0000', '27,0000', '270,0000', '274,0000', '275,0000',
'277,0000', '28,0000', '280,0000', '285,0000', '285,2000',
'287,0000', '29,0000', '29,5000', '290,0000', '298,0000',
'30,0000', '30,5000', '300,0000', '308,0000', '31,0000', '31,2000',
'311,0000', '315,0000', '32,0000', '32,8000', '33,0000',
'331,0000', '334,0000', '335,0000', '34,0000', '346,0000',
'349,0000', '35,0000', '35,5000', '350,0000', '354,0000',
'36,0000', '36,5000', '37,0000', '375,0000', '378,0000', '38,0000',
'38,5000', '39,0000', '399,0000', '40,0000', '40,8000', '400,0000',
'41,0000', '41,1000', '41,5000', '411,0000', '42,0000', '42,5000',
'424,0000', '43,0000', '43,5000', '439,0000', '44,0000', '44,3000',
'45,0000', '46,0000', '46,5000', '47,0000', '48,0000', '48,8000',
'480,0000', '49,0000', '49,3000', '49,5000', '49,6000', '490,0000',
'50,0000', '50,2000', '50,5000', '50,8000', '51,0000', '51,5000',
'52,0000', '52,5000', '53,0000', '53,2000', '54,0000', '54,5000',
'55,0000', '55,5000', '55,7000', '56,0000', '56,5000', '56,6000',
'56,7000', '57,0000', '57,5000', '57,8000', '570,0000', '58,0000',
'58,5000', '58,8000', '584,0000', '59,0000', '59,5000', '59,8000',
'60,0000', '61,0000', '62,0000', '63,0000', '63,5000', '630,0000',
'64,0000', '65,0000', '65,4000', '654,0000', '66,0000', '67,0000',
'67,5000', '67,8000', '68,0000', '69,0000', '70,0000', '70,5000',
'71,0000', '72,0000', '72,5000', '73,0000', '73,5000', '74,0000',
'74,5000', '75,0000', '76,0000', '77,0000', '78,0000', '78,8000',
'79,0000', '80,0000', '80,5000', '81,0000', '82,0000', '83,0000',
'84,0000', '85,0000', '850,0000', '87,0000', '88,0000', '89,0000',
'90,0000', '900,0000', '91,0000', '910,0000', '92,0000',
'920,0000', '93,0000', '94,0000', '94,8000', '945,0000', '95,0000',
'95,4000', '96,0000', '97,0000'], dtype=object)
Agora temos um DataFrame bem formatado com dados suficientes do período especificado que podem ser mesclados com outros conjuntos de dados.
Qual é a estatistica Descritiva dos principais dados numéricos?
stats = sales_data.describe()[['Preço_kg','Preço_KG_USD', 'US_Dollar_in_R$','Quantidade', 'Total']]
stats
| Preço_kg | Preço_KG_USD | US_Dollar_in_R$ | Quantidade | Total | |
|---|---|---|---|---|---|
| count | 18464.000000 | 18464.000000 | 18464.000000 | 18464.000000 | 18464.00000 |
| mean | 4.278443 | 1.513351 | 2.852116 | 2514.499458 | 10409.35993 |
| std | 2.492917 | 0.482775 | 1.173674 | 2558.492755 | 13007.79520 |
| min | 1.900000 | 0.550728 | 1.533700 | 19.000000 | 54.15000 |
| 25% | 2.750000 | 1.159350 | 1.839000 | 1051.000000 | 3720.39750 |
| 50% | 3.410000 | 1.430998 | 2.321800 | 1672.000000 | 6516.70500 |
| 75% | 4.670000 | 1.776863 | 3.720200 | 3002.000000 | 11967.15000 |
| max | 17.880000 | 4.553903 | 5.936600 | 34733.000000 | 253272.00000 |
price_view = sales_data['Preço_kg'].plot(kind = 'kde', title= 'Preço/Kg-Concentração de Ocorrência')
price_view.set_xlabel('Preço_kg')
Text(0.5, 0, 'Preço_kg')
# Pricing Visualization (box plots)
plt.figure(figsize=(12, 6))
sns.boxplot(x='Preço_kg', data=sales_data)
plt.title('Distribuição do Preço/KG')
plt.show()
price_view = sales_data['Preço_kg'].plot(kind = 'hist', bins = 80, title= 'Distribuição do Preço/Kg-R$')
price_view.set_xlabel('Preço_kg')
price_view.set_ylabel('Contagem')
Text(0, 0.5, 'Contagem')
dollar_view = sales_data['US_Dollar_in_R$'].plot(kind = 'kde', title= 'Dolar-Concentração de Ocorrência')
dollar_view = sales_data['US_Dollar_in_R$'].plot(kind = 'hist', bins = 80, title= 'Concentração do Valor do Dolar')
dollar_view.set_xlabel('US_Dollar_in_R$')
dollar_view.set_ylabel('Contagem')
Text(0, 0.5, 'Contagem')
Qual é correlação entre o preço dos materiais e a variação do preço do dólar?
plt.figure(figsize=(10, 4))
sns.scatterplot(data=sales_data, x='Preço_kg', y='US_Dollar_in_R$', hue='Preço_kg')
plt.xlabel('Preço_kg')
plt.ylabel('US_Dollar_in_R$')
plt.title('Correlation between Preço_kg and US_Dollar')
plt.show()
Qual é a correlação entre as demais variáveis?
correlation_matrix = sales_data.corr()
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('Correlation Heatmap')
plt.show()
/tmp/ipykernel_3552891/3965154667.py:2: FutureWarning: The default value of numeric_only in DataFrame.corr is deprecated. In a future version, it will default to False. Select only valid columns or specify the value of numeric_only to silence this warning. correlation_matrix = sales_data.corr()
numeric_columns = sales_data.select_dtypes(include=['float64', 'int64'])
sns.pairplot(numeric_columns)
plt.suptitle('Pairplot of Numeric Columns')
plt.show()
Como é variação de preço por Tipo de Produto?
plt.figure(figsize=(14, 6))
sns.boxplot(x='Tipo de Produto', y='Preço_kg', data=sales_data)
plt.title('Distribuição de Preço por Tipo de Produto')
plt.xticks(rotation=90)
plt.show()
Qual é menor e maior preço por família de Produto?
min_max_data = product_group['Preço_kg'].agg([min, max])
# Reset the index to make the columns as regular columns
min_max_data = min_max_data.reset_index()
min_max_data
| Família Produto | min | max | |
|---|---|---|---|
| 0 | BLANK | 2.52 | 13.50 |
| 1 | BOBINA | 2.03 | 13.65 |
| 2 | CHAPA | 1.90 | 14.82 |
| 3 | CORTE TÉRMICO | 2.52 | 7.14 |
| 4 | FITA | 2.09 | 17.88 |
| 5 | PERFIL | 2.11 | 4.96 |
| 6 | RELAMINADO | 2.90 | 16.98 |
| 7 | TELHA | 3.07 | 7.91 |
| 8 | TIRA CORTADA | 2.46 | 3.45 |
| 9 | TUBO | 2.45 | 2.45 |
plt.figure(figsize=(10, 6))
plt.plot(min_max_data['Família Produto'], min_max_data['min'], label='Minimum Price', color='blue' )
plt.plot(min_max_data['Família Produto'], min_max_data['max'], label='Maximum Price', color='green')
plt.xlabel('Família Produto')
plt.ylabel('Preço_kg')
plt.title('Mínimo e Máximo preço por Produto')
plt.xticks(rotation=45)
plt.legend()
plt.show()
# Time Series Analysis:
sales_data.set_index('Data')['Total'].plot(title='Vendas em R$ sobre Tempo', figsize=(12, 6))
plt.xlabel('Date')
plt.ylabel('Total Sales')
plt.show()
# Time Series Analysis:
sales_data.set_index('Data')['Quantidade'].plot(title=' Vendas em Kg sobre Tempo', figsize=(12, 6))
plt.xlabel('Date')
plt.ylabel('Quantity')
plt.show()
# Group by year and calculate the total quantity and the total quantity in the previous year
quantity_variation = sales_data.groupby('Ano')['Quantidade'].sum()
quantity_variation_previous = quantity_variation.shift(1)
# Calculate the percentage variation
percentage_variation = ((quantity_variation - quantity_variation_previous) / quantity_variation_previous) * 100
# Plot the percentage variation
plt.figure(figsize=(10, 6))
percentage_variation.plot(kind='bar', color='lightgreen')
plt.title('Variação Percentual da Quantidade em % sobre Tempo')
plt.xlabel('Year')
plt.ylabel('Percentage Variation (%)')
plt.show()
# Group by year and calculate the total quantity and the total quantity in the previous year
quantity_variation = sales_data.groupby('Ano')['Total'].sum()
quantity_variation_previous = quantity_variation.shift(1)
# Calculate the percentage variation
percentage_variation = ((quantity_variation - quantity_variation_previous) / quantity_variation_previous) * 100
# Plot the percentage variation
plt.figure(figsize=(10, 6))
percentage_variation.plot(kind='bar', color='lightgreen')
plt.title('Variação Percentual do Valor sobre Tempo')
plt.xlabel('Year')
plt.ylabel('Percentage Variation (%)')
plt.show()
plt.figure(figsize=(12, 6))
quantity_variation.plot(marker='o', linestyle='-')
plt.title('Variação Percentual do Valor sobre Tempo')
plt.xlabel('Ano')
plt.ylabel('Total em R$')
plt.grid(True)
plt.show()
Qual é o volume em peso de materiais vendidos durante o perído?
values = ['Quantidade']
sales_years = sales_data.groupby('Ano')[values].sum().reset_index()
sales_years = sales_years.sort_values(['Quantidade'], ascending=True)
plt.figure(figsize=(10, 6))
plt.bar(sales_years['Ano'], sales_years['Quantidade'])
plt.xlabel('Ano')
plt.ylabel('Soma')
plt.title('Quantidade por Ano')
plt.show()
sales_years
| Ano | Quantidade | |
|---|---|---|
| 0 | 2007 | 1578837 |
| 16 | 2023 | 1604876 |
| 15 | 2022 | 1657733 |
| 14 | 2021 | 1791880 |
| 2 | 2009 | 1824527 |
| 13 | 2020 | 2220576 |
| 1 | 2008 | 2241356 |
| 9 | 2016 | 2284979 |
| 10 | 2017 | 2312175 |
| 12 | 2019 | 2812871 |
| 11 | 2018 | 3035568 |
| 8 | 2015 | 3367661 |
| 7 | 2014 | 3463187 |
| 4 | 2011 | 3527233 |
| 3 | 2010 | 3710843 |
| 5 | 2012 | 4076627 |
| 6 | 2013 | 4916789 |
Qual é o volume financeiro de materiais vendidos durante o perído?
values = ['Total']
sales_years = sales_data.groupby('Ano')[values].sum().reset_index()
#sales_years = sales_years.sort_values(['Quantidade'], ascending=False)
plt.figure(figsize=(10, 6))
plt.bar(sales_years['Ano'], sales_years['Total'])
plt.xlabel('Ano')
plt.ylabel('Soma')
plt.title('Volume em R$ por Ano')
plt.show()
sales_years
| Ano | Total | |
|---|---|---|
| 0 | 2007 | 4053582.65 |
| 1 | 2008 | 7419169.34 |
| 2 | 2009 | 5812028.05 |
| 3 | 2010 | 10855256.97 |
| 4 | 2011 | 8923399.56 |
| 5 | 2012 | 10064377.31 |
| 6 | 2013 | 14058140.99 |
| 7 | 2014 | 11169488.72 |
| 8 | 2015 | 10573777.50 |
| 9 | 2016 | 8385675.50 |
| 10 | 2017 | 10108472.07 |
| 11 | 2018 | 14025342.29 |
| 12 | 2019 | 12982344.28 |
| 13 | 2020 | 11862167.15 |
| 14 | 2021 | 20553791.46 |
| 15 | 2022 | 17208099.86 |
| 16 | 2023 | 14143308.05 |
Qual é o melhor mês de vendas?
monthly_sales = sales_data.groupby('Mês')['Quantidade'].sum()
plt.figure(figsize=(10, 6))
monthly_sales.plot(kind='bar', title='Comportamento Histórico Mensal/KG')
plt.xlabel('Mês')
plt.ylabel('Quantidade')
plt.show()
Qual é o dia com maior volume de faturamento?
sales_day = sales_data.groupby('Dia')[['Quantidade']].sum().reset_index()
sales_day = sales_day.sort_values(['Quantidade'], ascending=True)
# plot the sales by day
plt.figure(figsize=(10, 6))
plt.bar(sales_day['Dia'], sales_day['Quantidade'])
plt.xticks(sales_day['Dia'])
plt.ylabel('Quantidade')
plt.title('Distribuição do Faturamento por Dia')
plt.xlabel('Dia')
plt.show()
sales_day
| Dia | Quantidade | |
|---|---|---|
| 1 | 2 | 1167771 |
| 0 | 1 | 1191950 |
| 30 | 31 | 1282070 |
| 2 | 3 | 1295637 |
| 11 | 12 | 1302599 |
| 6 | 7 | 1320144 |
| 5 | 6 | 1365809 |
| 20 | 21 | 1382547 |
| 14 | 15 | 1386508 |
| 16 | 17 | 1392646 |
| 8 | 9 | 1396384 |
| 3 | 4 | 1425455 |
| 19 | 20 | 1433862 |
| 4 | 5 | 1445234 |
| 10 | 11 | 1475815 |
| 24 | 25 | 1482382 |
| 23 | 24 | 1509186 |
| 25 | 26 | 1519991 |
| 22 | 23 | 1538110 |
| 18 | 19 | 1545037 |
| 7 | 8 | 1549045 |
| 15 | 16 | 1567381 |
| 21 | 22 | 1577190 |
| 12 | 13 | 1579384 |
| 13 | 14 | 1627537 |
| 27 | 28 | 1689862 |
| 28 | 29 | 1701274 |
| 26 | 27 | 1723067 |
| 29 | 30 | 1755781 |
| 9 | 10 | 1841193 |
| 17 | 18 | 1956867 |
Como é o volume acumulado de Familia de Produto?
# Group and sum the data
grouped_data = sales_data.groupby(['Ano', 'Família Produto'])[['Quantidade']].sum().reset_index()
grouped_data = grouped_data.sort_values(['Quantidade'], ascending=False)
# Create a pivot table for better visualization
pivot_data = grouped_data.pivot(index='Ano', columns='Família Produto', values='Quantidade')
# Plot the pivot table
plt.figure(figsize=(10, 6))
pivot_data.plot(kind='bar', stacked=True, figsize=(10, 6))
plt.xlabel('Ano')
plt.ylabel('Sum of Quantity_KG')
plt.title('Quantidade por Ano e por Familia de Produto')
plt.legend()
plt.show()
#grouped_data
<Figure size 1000x600 with 0 Axes>
Qual é o produto campeão de vendas?
product_group = sales_data.groupby(['Família Produto'])
product_group_val = product_group['Quantidade'].sum().reset_index()
product_group_val = product_group_val.sort_values(['Quantidade'], ascending=False)
plt.figure(figsize=(10, 6))
sns.barplot(x='Família Produto', y='Quantidade', data=product_group_val)
plt.xlabel('Família Produto')
plt.ylabel('Quantidade em KG')
plt.title('Vendas por Familia de Produto')
plt.xticks(rotation=75)
plt.show()
Quais são os diferentes tipos de fitas vendidas?
filtered_product = sales_data[sales_data['Família Produto'] == 'FITA']
filtered_product_val = filtered_product.groupby('Tipo de Produto')['Quantidade'].sum().reset_index()
filtered_product_val = filtered_product_val.sort_values(['Quantidade'], ascending=False)
plt.figure(figsize=(10, 6))
sns.barplot(x='Tipo de Produto', y='Quantidade', data=filtered_product_val)
plt.xlabel('Tipo de Produto')
plt.ylabel('Quantidade (KG)')
plt.title('Quantidade Vendida por tipo de FITA')
plt.xticks(rotation=45)
plt.show()
Qual é a frequência por tipo de Produto?
product_count = sales_data[['Tipo de Produto']].value_counts().to_frame()
product_count = product_count.rename(columns={0: 'Frequency'})
product_count.reset_index()
plt.figure(figsize=(10, 6))
sns.barplot(x=product_count.index.get_level_values(0), y='Frequency', data=product_count)
plt.xlabel('Tipo de Produto')
plt.ylabel('Frequency')
plt.title('Frequencia por Tipo de Produto')
plt.xticks(rotation=90)
plt.show()
Qual é o valor total concentrado por Tipo de produto?
# Financial Analysis:
plt.figure(figsize=(12, 6))
sales_data.groupby('Tipo de Produto')['Total'].sum().sort_values(ascending=False).plot(kind='bar')
plt.title('Vendas em R$ Concentradas por Tipo de Produto')
plt.xlabel('Product Type')
plt.ylabel('Total Sales')
plt.show()
Qual é a quantidade vendida por Família de produto?
# Group by 'Cliente' and sum the 'Quantidade'
quantidade_per_material = sales_data.groupby('Família Produto')['Quantidade'].sum().sort_values().reset_index()
# Print the DataFrame
quantidade_per_material
| Família Produto | Quantidade | |
|---|---|---|
| 0 | TUBO | 235 |
| 1 | TELHA | 23027 |
| 2 | TIRA CORTADA | 37253 |
| 3 | PERFIL | 78356 |
| 4 | CORTE TÉRMICO | 120962 |
| 5 | BOBINA | 1600308 |
| 6 | BLANK | 1731815 |
| 7 | RELAMINADO | 2878207 |
| 8 | FITA | 14317862 |
| 9 | CHAPA | 25639693 |
product_family_distribution = sales_data['Família Produto'].value_counts()
product_family_distribution.plot.pie(autopct='%1.1f%%', startangle=90, title='Product Family Distribution')
plt.axis('equal') # Equal aspect ratio ensures that pie is drawn as a circle.
plt.show()
Qual é a quantidade vendida por Tipo de produto?
# Group by 'Cliente' and sum the 'Quantidade'
quantidade_per_material = sales_data.groupby('Tipo de Produto')['Quantidade'].sum().sort_values().reset_index()
# Print the DataFrame
quantidade_per_material
| Tipo de Produto | Quantidade | |
|---|---|---|
| 0 | TUBO QUAD | 235 |
| 1 | CUMEEIRA | 365 |
| 2 | CGAL | 1121 |
| 3 | TFF OL | 2041 |
| 4 | PERFIL FF | 3530 |
| 5 | TFQ | 13486 |
| 6 | PERFIL GR LTQ | 13669 |
| 7 | FAE | 20340 |
| 8 | TIRA GR LTQ | 21726 |
| 9 | TELHA | 22662 |
| 10 | LASER | 33488 |
| 11 | CFQ PISO | 41421 |
| 12 | PERFIL FQ | 61157 |
| 13 | BOBINA FQ DECOL | 63635 |
| 14 | BOBINA FF | 64526 |
| 15 | OXICORTE | 87474 |
| 16 | TIRA GALV BOB | 122915 |
| 17 | CHAPA GR LTQ DECOL | 128081 |
| 18 | TFQ BOB | 152737 |
| 19 | BOBINA GR LTQ | 175305 |
| 20 | BKGRLTQ | 226630 |
| 21 | BOBINA FQ | 379345 |
| 22 | BOBINA GALVALUME | 395627 |
| 23 | BOBINA ZC | 521870 |
| 24 | CG DO LCG | 720081 |
| 25 | CZC | 1494615 |
| 26 | TFQ DEC BOB | 1501004 |
| 27 | BKFF | 1505185 |
| 28 | CFQ DEC OL | 2516611 |
| 29 | CFF OL | 2876534 |
| 30 | TIRA REL | 2878207 |
| 31 | TZC BOB | 5475501 |
| 32 | CFQ | 5733243 |
| 33 | TFF OL BOB | 7045365 |
| 34 | CG DO LTQ | 12127986 |
Como é o volume de vendas por espessura?
quant_by_thick = sales_data.groupby('Esp')[['Quantidade']].sum().reset_index()
quant_by_thick = quant_by_thick.sort_values(['Quantidade'], ascending=False)
plt.figure(figsize=(10, 6))
sns.barplot(x='Esp', y='Quantidade', data=quant_by_thick)
plt.xlabel('Espessura')
plt.ylabel('Sum of Quantity_KG')
plt.title('Volume de Vendas por Espessura')
plt.xticks(rotation=90) # Rotate x-axis labels by 45 degrees
plt.show()
with pd.option_context('display.max_rows', None, 'display.max_columns', None):
print(quant_by_thick)
Esp Quantidade 68 9,5000 3720536 65 8,0000 3141363 61 6,3000 3017636 26 1,2500 2892476 49 3,0000 2517213 27 1,5000 2515880 12 0,6000 2376591 23 1,2000 2166400 56 4,2500 2152377 18 0,9000 1958857 44 2,6500 1915645 40 2,0000 1806811 35 12,5000 1790910 2 0,3000 1714835 32 1,9500 1429020 58 4,7500 1290580 4 0,3500 1172793 28 1,5500 981752 67 9,0000 939966 15 0,7500 783274 31 1,9000 756788 19 0,9500 546261 10 0,5000 463221 21 1,0600 430854 22 1,1100 381064 41 2,2500 325500 6 0,4300 280829 16 0,8000 277774 45 2,7000 256753 52 3,7500 253014 5 0,4000 222438 42 2,3000 212473 38 16,0000 203670 53 31,5000 197939 7 0,4500 177924 50 3,3500 114389 48 25,0000 111703 57 4,7400 107657 55 4,0000 107122 39 19,0000 98364 54 37,5000 75433 13 0,6500 72725 47 22,4000 58387 46 2,9900 57192 33 10,0000 56641 30 1,8000 45820 60 50,0000 37699 43 2,5000 31377 34 11,2000 25668 0 0,2500 18440 36 14,0000 18106 51 3,5000 12880 20 1,0000 12008 63 63,0000 11400 37 150,0000 10613 25 1,2400 10336 66 89,0000 9316 59 44,5000 8957 11 0,5500 8893 14 0,7000 8669 62 6,3500 8286 24 1,2100 6675 8 0,4700 4400 9 0,4900 2456 29 1,6000 1469 64 75,0000 1263 1 0,2700 995 17 0,8100 688 3 0,3300 274
sales_data['Quantidade'].plot(kind='hist', bins=70, title='Ticket Médio em Kg')
plt.xlabel('Quantity')
plt.ylabel('Frequency')
plt.show()
plt.figure(figsize=(10, 6))
clients_per_year = sales_data.groupby(['Ano'])['Cliente'].nunique()
clients_per_year.plot(kind='bar', color='green')
plt.title('Numero de Clientes por Ano')
plt.xlabel('Ano')
plt.ylabel('Numero de Clientes')
for i, value in enumerate(clients_per_year):
plt.text(i, value + 0.1, str(value), ha='center', va='bottom')
plt.show()
Qual é o volume de compras por cliente?
# Group by 'Cliente' and sum the 'Quantidade'
quantidade_per_cliente = sales_data.groupby('Cliente')['Quantidade'].sum().sort_values().reset_index()
# Print the DataFrame
with pd.option_context('display.max_rows', None, 'display.max_columns', None):
print(quantidade_per_cliente)
Cliente Quantidade 0 LINADALMORO 521 1 RECHEPADIL 550 2 DEMORE 560 3 CORTACO 623 4 GLOBOMIX 695 5 ATENA 711 6 HOFFMANN1 717 7 GANADAL 731 8 MAVE 842 9 OXICORTE 865 10 SCHIOLTDA 942 11 MILANOMOV 1047 12 CORDATEX 1065 13 SOFISA 1085 14 SCARIOTMET 1218 15 SANMARCO 1343 16 MACEDOBIOND 1389 17 GILMARPEGOR 1469 18 CONTRUBEL 1490 19 MDOLTDA 1518 20 IRMAOSMOTA 1569 21 JARFLEX 1583 22 TECNOMETAL 1608 23 IECODESENVO 1665 24 RAINE 1668 25 BEMFATTO 1729 26 LEAFARLOGIS 1827 27 KALIENT 1833 28 ENVEL 1843 29 REGIACOM 1988 30 FAMM 2045 31 MAGNUMETALU 2064 32 ATHENA 2091 33 CJINDUST 2174 34 METALBRIL 2203 35 MILENIUMTR 2250 36 DANFERLTDA 2288 37 AGOSTINETTO 2289 38 IRMAOSLUVIS 2347 39 MALTAIND 2358 40 CRICELMONT 2458 41 JKFERREIRA 2756 42 FAMCORP 2795 43 ARQUITETARIA 2855 44 TREGA 2856 45 SUPRAMEC 2859 46 SPOTSUL 2902 47 MULTIFER 2916 48 ASP 2968 49 GEDOZ 2982 50 TEDESCOLTDA 3041 51 BRINDILUZ 3116 52 ASSISTEMAQ 3337 53 IPE 3403 54 NONOFERRERO 3405 55 ANHANGUERA 3417 56 JAY 3694 57 SULTORRES 3706 58 LTMET 3826 59 CASTERSUL 3867 60 COBRA 3889 61 UNITECINDUS 4015 62 ARCOIRISIN 4034 63 DUPARCEMPRE 4101 64 THEPLACE 4359 65 ARMARINHOS 4424 66 DOSULINDE 4577 67 FURGOKIT'S 4602 68 PAG 4718 69 MULTIAR 4732 70 GPER 4754 71 DARDOCOMERC 4893 72 EXPRESSOVR 4952 73 MICHELEHAAB 4974 74 DIMILANOPO 5061 75 PROTECARTER 5062 76 D.M.VIANA 5089 77 ARSILVA 5408 78 MORKATA 5750 79 MENEGOTTO 5809 80 DITALINDE 5836 81 EDREAZA 5870 82 TRG 6035 83 MDO 6165 84 SEG 6249 85 METALCUBAS 6311 86 RAVINOXMETA 6359 87 VILLAFRANCA 6575 88 FIXAR 6599 89 NOVOPAPAGAI 6870 90 ZANBOR 6965 91 GAUER 7275 92 METCECHINAT 7295 93 REBITSUL 7339 94 IPR 7450 95 TRONCONTROL 7516 96 RD 7541 97 UMBERTOBERT 7603 98 PLASTICENTE 7862 99 FRAMA 7941 100 FORBAL 8002 101 SAOMARCOSL 8003 102 PROMATE 8126 103 SUNWAVEIN 8129 104 MECANICACAR 8660 105 G3INDUSTRIA 8743 106 UTIL-LINE 8844 107 UNYPERINDUS 9157 108 TRACO 9316 109 AHJ 9396 110 QUADRITECH 10081 111 SILDRE 10486 112 TATACOM 10532 113 RDINDECOM 10707 114 RESIDAINCOR 10826 115 METMDBLTDA 10989 116 CTRESIND 11048 117 60MOSMANN 11593 118 SUERJE 11628 119 TECNIARTE 11718 120 METALNOVA 11729 121 G3PLASTICOS 12017 122 CARLOSGOMES 12036 123 GENERALCOAT 12201 124 AMMINDDE 12205 125 POMMIER 12367 126 CCGL 12404 127 AGGYINDUST 12506 128 ANTONIOTEGN 12731 129 INELFAIND 12802 130 ACO3D 12837 131 METSALVADOR 13001 132 DOMPEL 13021 133 COMPACTIND 13067 134 TUTTO 13669 135 DALE 13930 136 GEETECEQUIP 13996 137 LOHR 14227 138 REVAL 14731 139 JOPEMAR 15038 140 FAMERTEC 15064 141 L.MARQUEZZO 15168 142 EXATAENGENH 15777 143 RBETIOLO 16182 144 RS 16325 145 IMZOLET 16432 146 MULTTECNICA 16619 147 FXOEIRELI 16862 148 KDM 16924 149 MRACARTOE 16947 150 AGROP.SCHIO 17090 151 TESSAROIND 17166 152 BENFATI 17252 153 IBP 17287 154 CIKLO 17344 155 RLG 17509 156 PHTRANS 18230 157 ACOGRATO 18528 158 ACESITASERV 19790 159 CHIAPERINI 19826 160 SCHIFER 19938 161 AGROPECSCHI 20100 162 GAUERAUTOPE 20315 163 BRANDA 21045 164 JARDIM 21170 165 SCHMITTUTIL 21225 166 GIGIOIND 21755 167 RALKY 22675 168 TECHMASTER 22878 169 FONTANAMAQ 24262 170 METALFORM 24616 171 DALMORO 25765 172 FERNANDA 25929 173 LCA 26193 174 BSBCONSTRUC 26746 175 FORMA 27429 176 GSDIND 28237 177 KAE 28408 178 BKCONST 28972 179 ANODILAR 29667 180 JMARCONIND 29689 181 ROLEJU 31162 182 BLPMAQUINAS 31795 183 GIACOMELLI 32972 184 MULTISERVSE 33977 185 MINERVA 34100 186 METALBEL 36439 187 RSCAXIAS 37655 188 MS-ENGENH 38798 189 QUADRILATERO 39038 190 IMPLYTECNOLO 44024 191 INCOMAQ 44233 192 IVANCARNINO 44397 193 CADERODE 44680 194 CAMERA 45019 195 CIM 46550 196 RZMAQ 47719 197 RODOV.SCHIO 51257 198 ALCASTS/A 52519 199 ESCOVASCRUZ 53869 200 ENIOSCARIOT 55796 201 MARTAN 57257 202 HYVADOBRAS 58176 203 PLASLINK 63763 204 CANELLO 63883 205 VIEMME 64220 206 NAUTEC 64545 207 STEFFENSIND 64677 208 RUGERIMECR 66433 209 FABBOF 66585 210 NZN 67151 211 JRIND.2 69783 212 PRONATTOEQU 70105 213 IBRAL 73212 214 ORQUIDEA 73588 215 BASECOMPONE 76868 216 RODAROS 77471 217 PMP 80406 218 GUARANY 82564 219 METALLIACOS 86232 220 OMPDOBRASI 87700 221 ACOBRASIL 89545 222 REVALIND 90227 223 NOVAGERACA 92244 224 METALEX 93857 225 PARTS 94189 226 ANDREMODENA 98982 227 COPRIMA 103211 228 AGROBENE 104117 229 ASPIRAZIONE 106336 230 MRPLASTDO 107319 231 RGB 112382 232 M7COMERCIO 114875 233 GASTROLIDER 116083 234 CRESPAR 128392 235 DAVAL 129743 236 KIFIXINDUST 131238 237 BORTOLOTTO 134047 238 MOVIMENTO 135558 239 ATIVICON 138517 240 LUZI 148981 241 KEKOACESS 149909 242 METALSTAMP 151664 243 BORGHETTI 162986 244 ANGONESE 166473 245 CEMTRA 172002 246 GASTROLIDE 172473 247 ROAL 174831 248 METAISWIZET 178403 249 MAACESS 179248 250 METSISTEM 182732 251 ALCAST 186163 252 RODAROS1 193587 253 GS 199498 254 SASPLASTI 206856 255 GIJON 210982 256 BRIMEL 215875 257 LAIND 236313 258 SCARELI 243289 259 SUPERACOIND 245098 260 UTIMIL 257552 261 RODAROSIND2 263684 262 INCORPOL 275226 263 JOSECELSO 281697 264 METCOSBI 283898 265 LUNA 296891 266 JRIND. 306410 267 CIRNA 352938 268 GPANIZIND 368774 269 D"ZAINER 412984 270 TECNOFRIO 421582 271 METCRESPAR 449976 272 UNIFERRO 455714 273 ACOPLANO 654242 274 PERFILLINE 686926 275 RODAROSIND 750359 276 ENGATCAR 1130543 277 LUPEME 1335554 278 RODARE 1360838 279 MAQENGE 1414076 280 VECTOR 1489952 281 HIDROJET 1931026 282 GPANIZ 2327136 283 METALMATRIX 2606002 284 MOFERKO 2732986 285 METMETALCIN 2943355 286 KEKO 4605456 287 FLANTECH 6202442
Quais clientes não compram acima de 90 dias?
# Identify the last purchase date for each client
last_purchase_date = sales_data.groupby('Cliente')['Data'].max()
# Identify clients who haven't made a purchase in over 120 days
inactive_clients = last_purchase_date[last_purchase_date < pd.to_datetime('today') - pd.DateOffset(days=90)]
# Count the number of inactive clients
inactive_clients_count = inactive_clients.shape[0]
# Sort inactive clients by their last purchase date
inactive_clients_sorted = inactive_clients.sort_values()
# Print the count and sorted list of inactive clients
print(f"Number of clients with no purchase in over 90 days: {inactive_clients_count}")
print("Sorted list of inactive clients:")
with pd.option_context('display.max_rows', None, 'display.max_columns', None):
print(inactive_clients_sorted)
Number of clients with no purchase in over 90 days: 273 Sorted list of inactive clients: Cliente JKFERREIRA 2007-04-04 FAMM 2007-04-19 JARFLEX 2007-04-30 METSALVADOR 2007-05-18 GANADAL 2007-06-06 FORBAL 2007-06-12 HOFFMANN1 2007-06-12 UMBERTOBERT 2007-06-20 TECNOMETAL 2007-07-18 LINADALMORO 2007-08-09 IRMAOSLUVIS 2007-08-27 IRMAOSMOTA 2007-08-30 SULTORRES 2007-09-11 MDO 2007-10-05 DIMILANOPO 2007-10-11 IPE 2007-10-26 JRIND.2 2007-12-17 MDOLTDA 2008-01-04 BRANDA 2008-01-18 PROTECARTER 2008-01-18 JRIND. 2008-04-30 MILANOMOV 2008-05-28 KALIENT 2008-06-04 CCGL 2008-06-13 IECODESENVO 2008-06-25 UTIL-LINE 2008-06-25 MINERVA 2008-06-27 MULTIFER 2008-06-30 BRINDILUZ 2008-07-09 METALNOVA 2008-07-18 TESSAROIND 2008-08-19 SCHIFER 2008-10-03 GASTROLIDER 2008-10-15 RSCAXIAS 2008-10-30 REGIACOM 2008-10-30 DEMORE 2009-02-05 CONTRUBEL 2009-02-11 SUERJE 2009-03-24 PAG 2009-06-30 TUTTO 2009-06-30 METALBRIL 2009-08-26 FORMA 2009-09-18 INELFAIND 2009-10-21 RECHEPADIL 2009-10-29 MACEDOBIOND 2009-11-05 UNITECINDUS 2009-11-19 RUGERIMECR 2009-12-11 COBRA 2009-12-22 GILMARPEGOR 2010-01-13 SOFISA 2010-01-22 ATENA 2010-01-27 FAMCORP 2010-01-29 FRAMA 2010-03-11 SEG 2010-03-22 RODAROS 2010-03-22 SANMARCO 2010-03-24 GLOBOMIX 2010-03-24 TECHMASTER 2010-04-06 RODAROS1 2010-04-07 G3PLASTICOS 2010-04-12 QUADRILATERO 2010-04-23 METALBEL 2010-04-29 METMDBLTDA 2010-06-01 IVANCARNINO 2010-06-11 TATACOM 2010-06-14 CORTACO 2010-06-18 BLPMAQUINAS 2010-07-30 GAUER 2010-09-22 BKCONST 2010-09-22 CORDATEX 2010-09-23 MORKATA 2010-10-11 ACESITASERV 2010-10-18 AGROP.SCHIO 2010-10-27 GSDIND 2010-11-05 AGOSTINETTO 2010-11-25 GASTROLIDE 2010-11-25 GPER 2010-12-13 60MOSMANN 2010-12-13 ARQUITETARIA 2010-12-13 SUPRAMEC 2010-12-15 TEDESCOLTDA 2011-01-04 ZANBOR 2011-01-19 SCHIOLTDA 2011-01-19 ENVEL 2011-01-24 ESCOVASCRUZ 2011-03-16 ORQUIDEA 2011-03-17 MARTAN 2011-03-23 MULTIAR 2011-03-30 FIXAR 2011-03-30 IPR 2011-03-30 DAVAL 2011-04-01 JARDIM 2011-05-09 ATHENA 2011-05-09 ANGONESE 2011-05-11 REVAL 2011-05-18 SPOTSUL 2011-06-02 JAY 2011-06-16 THEPLACE 2011-07-11 PMP 2011-07-13 PLASTICENTE 2011-07-26 RAINE 2011-07-26 RGB 2011-08-11 KEKOACESS 2011-08-17 COMPACTIND 2011-08-23 CARLOSGOMES 2011-08-24 NZN 2011-08-29 MAVE 2011-09-05 DALMORO 2011-09-26 NAUTEC 2011-10-04 RESIDAINCOR 2011-10-24 REVALIND 2011-10-28 NONOFERRERO 2011-11-28 INCOMAQ 2012-01-27 KDM 2012-02-16 OXICORTE 2012-03-12 GENERALCOAT 2012-03-16 FURGOKIT'S 2012-03-21 TRACO 2012-03-26 GIJON 2012-04-20 DITALINDE 2012-04-24 RLG 2012-05-15 RODOV.SCHIO 2012-05-17 RS 2012-07-10 AGROPECSCHI 2012-08-01 AHJ 2012-11-07 RZMAQ 2012-11-23 VILLAFRANCA 2012-11-28 CIM 2012-12-10 GIACOMELLI 2012-12-18 ARCOIRISIN 2012-12-19 DOSULINDE 2013-01-04 ASSISTEMAQ 2013-01-29 SILDRE 2013-02-18 MILENIUMTR 2013-03-22 ANODILAR 2013-04-04 PLASLINK 2013-04-11 FONTANAMAQ 2013-05-13 METSISTEM 2013-05-31 KAE 2013-06-17 MECANICACAR 2013-06-17 CASTERSUL 2013-07-15 MOVIMENTO 2013-08-27 IBP 2013-08-28 GPANIZIND 2013-09-12 SCHMITTUTIL 2013-09-13 CANELLO 2013-10-01 METALFORM 2013-11-19 MICHELEHAAB 2013-12-02 ACOBRASIL 2013-12-03 IBRAL 2013-12-10 MALTAIND 2013-12-10 CRICELMONT 2013-12-12 COPRIMA 2013-12-18 RODAROSIND 2014-01-27 CTRESIND 2014-01-30 DANFERLTDA 2014-02-28 MAGNUMETALU 2014-05-20 BENFATI 2014-06-02 INCORPOL 2014-06-03 METCECHINAT 2014-06-03 RDINDECOM 2014-06-09 LTMET 2014-06-13 MAACESS 2014-06-18 SAOMARCOSL 2014-06-27 ACOGRATO 2014-07-14 ANTONIOTEGN 2014-08-08 GIGIOIND 2014-08-13 HYVADOBRAS 2014-08-29 MENEGOTTO 2014-08-29 IMPLYTECNOLO 2014-09-22 STEFFENSIND 2014-10-10 METALCUBAS 2014-10-14 DUPARCEMPRE 2014-11-04 LAIND 2014-11-06 RBETIOLO 2014-11-27 MRACARTOE 2014-12-03 POMMIER 2015-01-29 CADERODE 2015-03-09 BORGHETTI 2015-03-16 TECNIARTE 2015-03-18 REBITSUL 2015-03-27 MULTISERVSE 2015-04-09 UNYPERINDUS 2015-04-13 RODAROSIND2 2015-06-10 BASECOMPONE 2015-07-01 PARTS 2015-07-21 TRONCONTROL 2015-09-23 ANDREMODENA 2015-10-19 MRPLASTDO 2015-10-20 D"ZAINER 2015-11-12 RAVINOXMETA 2016-01-27 PRONATTOEQU 2016-03-21 ATIVICON 2016-04-18 IMZOLET 2016-05-17 METALLIACOS 2016-06-07 FAMERTEC 2016-06-10 FABBOF 2016-06-27 GPANIZ 2016-08-01 ROLEJU 2016-08-09 ASP 2016-08-11 PROMATE 2016-08-23 TREGA 2017-09-14 DALE 2017-09-29 EDREAZA 2017-10-23 LUZI 2017-10-24 JMARCONIND 2018-01-10 VECTOR 2018-01-11 RODARE 2018-02-01 SCARIOTMET 2018-02-26 TECNOFRIO 2018-02-28 RD 2018-03-29 ROAL 2018-04-04 SUPERACOIND 2018-05-23 LCA 2018-07-30 LUNA 2018-12-03 ENIOSCARIOT 2019-02-15 ARMARINHOS 2019-02-18 M7COMERCIO 2019-03-08 D.M.VIANA 2019-03-26 EXATAENGENH 2019-03-26 LEAFARLOGIS 2019-05-31 MULTTECNICA 2019-06-03 FXOEIRELI 2019-06-13 BORTOLOTTO 2019-07-24 JOSECELSO 2019-08-27 TRG 2019-08-30 ACO3D 2019-09-09 SUNWAVEIN 2019-09-10 FERNANDA 2019-09-17 LOHR 2019-09-19 NOVAGERACA 2019-09-26 ARSILVA 2019-10-17 QUADRITECH 2019-10-30 BSBCONSTRUC 2019-11-28 AGGYINDUST 2019-12-06 DARDOCOMERC 2019-12-12 GEDOZ 2020-02-18 GEETECEQUIP 2020-02-19 NOVOPAPAGAI 2020-02-20 JOPEMAR 2020-03-16 L.MARQUEZZO 2020-05-04 MS-ENGENH 2020-07-28 ANHANGUERA 2020-07-28 AMMINDDE 2020-08-18 CIKLO 2020-10-21 DOMPEL 2020-12-21 CEMTRA 2021-04-13 GAUERAUTOPE 2021-05-04 BRIMEL 2021-06-30 METAISWIZET 2021-07-02 CJINDUST 2021-09-13 AGROBENE 2021-09-29 ENGATCAR 2021-11-19 PERFILLINE 2021-11-22 METALEX 2022-05-19 GUARANY 2022-06-29 BEMFATTO 2022-08-10 EXPRESSOVR 2022-10-19 UNIFERRO 2022-10-27 CRESPAR 2022-11-22 CAMERA 2022-12-22 PHTRANS 2023-02-01 G3INDUSTRIA 2023-04-05 GS 2023-04-13 VIEMME 2023-05-15 RALKY 2023-05-22 ALCASTS/A 2023-05-31 CIRNA 2023-07-19 METCOSBI 2023-08-09 ALCAST 2023-08-22 SASPLASTI 2023-08-31 ACOPLANO 2023-08-31 SCARELI 2023-09-04 Name: Data, dtype: datetime64[ns]
Ao visualizar os dados, podemos obter uma compreensão mais profunda de sua distribuição em diferentes variáveis. Podemos examinar como as vendas se concentram em tipos específicos de produtos e espessuras, além de observar a variação de preço e volume ao longo do tempo. Percebemos uma correlação direta entre a taxa de câmbio do dólar o preço das matérias-primas. No entanto, para obter uma compreensão mais abrangente, seria benéfico incorporar outras variáveis econômicas e fatores adicionais de análise e predição, que possam servir como indicadores de flutuações de preços, problemas finaceiros e probabilidade de vendas.
Percebemos uma diminuição no volume das vendas de chapas que impactam diretamente o desempenho e embora não seja esplicito no relatório, a queda se deve, principalmente, a problemas financeiros e ao fechamento de empresas na Região, dentre elas, Rodare, Rodaros, Hidro Jet, Keko, Moferko, Perfilline, Metalcin, Engatcar, Vector, Luna...
A maior parte dos questiomentos iniciais permacem em aberto são objetos de aprofundamento deste trabalho.